package com.theta.gateway.biz.converter;

import java.util.List;

import com.google.common.collect.Lists;
import com.theta.gateway.biz.dto.request.RoutePredicateSaveRequest;
import com.theta.gateway.biz.dto.request.RouteSaveRequest;
import com.theta.gateway.biz.dto.response.RouteCfgVO;
import com.theta.gateway.infra.common.constants.SystemConstant;
import com.theta.gateway.infra.common.enums.ValidFlagEnum;
import com.theta.gateway.infra.common.utils.BeanCopierUtils;
import com.theta.gateway.infra.common.utils.DateUtils;
import com.theta.gateway.infra.common.utils.JsonUtil;
import com.theta.gateway.infra.common.utils.StrUtil;
import com.theta.gateway.infra.routecfg.model.converter.RouteDTOConverter;
import com.theta.gateway.infra.routecfg.model.dataobject.request.RouteCfgSaveDTO;
import com.theta.gateway.infra.routecfg.model.dataobject.response.CommonObjectDO;
import com.theta.gateway.infra.routecfg.model.dataobject.response.RouteCfgDO;
import com.theta.gateway.infra.routecfg.model.dataobject.response.RouteInfoDO;
import com.theta.gateway.infra.routecfg.model.dataobject.response.RouteInfoFilterDO;
import com.theta.gateway.infra.routecfg.model.dataobject.response.RouteInfoPredicateDO;

public class BizBOConverter {
	
	
	
//	public static RouteInfoDO convertRouteCfgDO2InfoDO(RouteCfgDO cfgDto) {
//		RouteInfoDO dto=new RouteInfoDO();
//		dto.setRouteId(SystemConstant.genRouteId(cfgDto.getId()));
//		dto.setUri(cfgDto.getUri());
//		dto.setOrder(StrUtil.obj2Integer(cfgDto.getOrderNo()));
//		dto.addPredicate(RouteInfoPredicateDO.builder()
//				.name(SystemConstant.getRoutePredicatePathName()).build()
//				.addArgs(SystemConstant.getRoutePredicateArgName(0), cfgDto.getPath()));
//		//断言处理
//		if(StrUtil.isNotEmpty(cfgDto.getRoutePredicateJson())) {
//			List<RoutePredicateSaveRequest> predicates= JsonUtil.toList(cfgDto.getRoutePredicateJson(), RoutePredicateSaveRequest.class);
//			predicates.stream().forEach(p->{
//				if(StrUtil.isNotEmpty(p.getName()) && StrUtil.isNotEmpty(p.getValue())) {
//					dto.addPredicate(RouteInfoPredicateDO.builder().name(p.getName())
//							.build().addArgs(SystemConstant.getRoutePredicateArgName(0), p.getValue()));
//				}
//			});
//		}
//		//路由过滤处理
//		if(StrUtil.isNotEmpty(cfgDto.getRouteFilterJson())) {
//			List<RouteInfoFilterDO> filters=RouteDTOConverter.convertFilterJson2Dolist(cfgDto.getRouteFilterJson());
//			dto.setFilters(filters);
//		}
//		//接入sso处理 为设置为接入sso的应用绑定登陆认证校验的filter
//		if(StrUtil.obj2Integer(cfgDto.getIsJoinSso()).intValue()==ValidFlagEnum.YES.getCode()) {
//			dto.addFilter(RouteInfoFilterDO.builder().name(SystemConstant.SSO_AUTHEN_FILTER_NAME)
//					.build().addArgs("name", cfgDto.getServiceId()));
//		}
//		return dto;
//	}
	
	/**
	 * 将json格式的filter转换成 filterDo
	 * @param filterJson
	 * @return
	 */
	public static List<RouteInfoFilterDO> convertFilterJson2Dolist(String filterJson){
		List<RouteInfoFilterDO> filters =Lists.newArrayList();
		if(StrUtil.isEmpty(filterJson)) {
			return filters;
		}
		List<CommonObjectDO> filterObjs = JsonUtil.toList(filterJson, CommonObjectDO.class);
		int index=0;
		for(CommonObjectDO f:filterObjs) {
			String[] filterValues= f.getValue().split(";");
			RouteInfoFilterDO filterDo=RouteInfoFilterDO.builder().name(f.getName()).build();
			for(String cfgVal:filterValues) {
				String[] values=cfgVal.split(":");
				if(values.length>1) {
					filterDo.addArgs(values[0].trim(),values[1].trim() );
				}else {
					filterDo.addArgs(SystemConstant.getRoutePredicateArgName(index), values[0].trim());
					index++;
				}
			}
			filters.add(filterDo);
		}
		return filters;
	}
	
	/**
	 * 将do实例转换为vo对象
	 * @param dto
	 * @return
	 */
	public static RouteCfgVO convertRouteCfgDO2VO(RouteCfgDO dto) {
		RouteCfgVO vo=null;
		if(dto!=null) {
			vo=new RouteCfgVO();
			BeanCopierUtils.copyProperties(dto, vo);
		}
		return vo;
	}
	
	/**
	 * 将biz层路由配置信息转换为domain中的请求
	 * @param request
	 * @return
	 */
	public static RouteCfgSaveDTO convertRouteSaveRequest2DomainDTO(RouteSaveRequest request) {
		RouteCfgSaveDTO cfgDto=new RouteCfgSaveDTO();
		BeanCopierUtils.copyProperties(request, cfgDto);
		cfgDto.setRoutePredicateJson(JsonUtil.toJsonString(request.getPredicates()));
		cfgDto.setRouteFilterJson(JsonUtil.toJsonString(request.getFilters()));
		cfgDto.setUri(StrUtil.isEmpty(request.getUri())?SystemConstant.getGatewayRouteUri(request.getServiceId()):request.getUri());
		
		cfgDto.setUpdateTime(DateUtils.getCurrentTimeNormal());
		return cfgDto;
	}

}
